home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / t_os / tmdsp / troll.c < prev    next >
C/C++ Source or Header  |  1991-10-18  |  2KB  |  101 lines

  1. /*
  2.     TROLL.C Ver 0.02 1991.08.09  by Y.Kurihara (Nif PDC01620)"
  3.         T-MENU の画面にちょっかいを出すプログラム  その2
  4.  
  5.     (1) TROLL  [<スクロール行数>]
  6.     (2) TROLL  <X座標> <Y座標> <桁数> <行数> [<スクロール行数>]
  7.  
  8.     (1) 全画面をスクロールする
  9.     (2) 指定範囲をスクロールする
  10. */
  11.  
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <string.h>
  15. #include <dos.h>
  16. #include <machine.h>
  17.  
  18. #define  X0    (2)
  19. #define  Xl    (76)
  20. #define  Y0    (7)
  21. #define  Yl    (20)
  22.  
  23. #define VRAM( offset )  ( (char far *)MK_FP( 0xc000,( offset ) ) )
  24. #define PORTpage     (0xff83)
  25. #define PORTplane    (0xff81)
  26. #define Y1page       (256)
  27. #define MAXbuff      (256)
  28.  
  29. char buff[ MAXbuff ];
  30.  
  31. void roll( int x1,int y1,int x2,int y2 )
  32. {
  33.     unsigned off;
  34.     int x,y;
  35.  
  36.     y1 = y1 *16;
  37.     y2 = y2 *16 + 15;
  38.     if( y1 < Y1page ) {
  39.         outp( PORTpage, 0x00 );
  40.         off = y1 * 128 + x1;
  41.     } else {
  42.         outp( PORTpage, 0x10 );
  43.         off = ( y1 - Y1page ) * 128 + x1;
  44.     }
  45.     x = x2 - x1 + 1;
  46.     for( y = y1; y < y2; y++ ) {
  47.         if( y == Y1page - 1 ) {
  48.             outp( PORTpage, 0x10 );
  49.             movedata( 0xc000,x1,FP_SEG(buff),FP_OFF(buff),x );
  50.             outp( PORTpage, 0x00 );
  51.             movedata( FP_SEG(buff),FP_OFF(buff),0xc000,off,x );
  52.             outp( PORTpage, 0x10 );
  53.             off = off + 128 - Y1page * 128;
  54.         } else {
  55.             movedata( 0xc000,off + 128,0xc000,off,x );
  56.             off += 128;
  57.         }
  58.     }
  59.     while( --x >= 0 ) {
  60.         *VRAM( off + x ) = 0xff;
  61.     }
  62.     return;
  63. }
  64.  
  65. main( int argc,char **argv )
  66. {
  67.     int save_page;
  68.     int save_plane;
  69.     int x1 = X0;
  70.     int y1 = Y0;
  71.     int x2 = Xl;
  72.     int y2 = Yl;
  73.     int n  = 1;
  74.  
  75.     if( argc >= 6 ) {
  76.         x1 = atoi( argv[1] );
  77.         y1 = atoi( argv[2] );
  78.         x2 = atoi( argv[3] );
  79.         y2 = atoi( argv[4] );
  80.         n  = atoi( argv[5] );
  81.     } else if( argc >= 2 ){
  82.         n  = atoi( argv[1] );
  83.     }
  84.  
  85.     if( x1 < 0 || y1 < 0 || x2 < 1 || y2 < 1 )  exit(1);
  86.     if( x1 >= 80 || y1 >= 30 )  exit(1);
  87.     if( ( x2 = x1 + x2 - 1 ) >= 80 )  x2 = 79;
  88.     if( ( y2 = y1 + y2 - 1 ) >= 30 )  y2 = 29;
  89.     n  = n * 16;
  90.  
  91.     save_page  = inp( PORTpage );
  92.     save_plane = inp( PORTplane );
  93.     outp( PORTplane,15 );
  94.  
  95.     while( n-- > 0 )  roll( x1,y1,x2,y2 );
  96.  
  97.     outp( PORTpage,  save_page );
  98.     outp( PORTplane, save_plane );
  99.     exit( 0 );
  100. }
  101.